import {areaTree} from './area';

/**
 * @desc 生成地区
 */
function randomArea() {
    const provinces = areaTree; // 假设 areaTree 包含所有省份
    const randomProvince = provinces[Math.floor(Math.random() * provinces.length)];
    const cities = randomProvince.districts; // 假设每个省份的 districts 包含所有城市
    const randomCity = cities[Math.floor(Math.random() * cities.length)];
    const districts = randomCity.districts; // 假设每个城市的 districts 包含所有区县
    const randomDistrict = districts[Math.floor(Math.random() * districts.length)];
    randomDistrict.name = randomProvince.name + randomCity.name + randomDistrict.name;
    return randomDistrict; // 返回随机选择的区县
}

/**
 * @desc 生成出生日期
 */
function randomBirth() {
    const birthYear = Math.floor(1970 + Math.random() * 50);
    const birthMonth = Math.floor(1 + Math.random() * 12).toString().padStart(2, '0');
    const birthDay = Math.floor(1 + Math.random() * 28).toString().padStart(2, '0');
    const birthDate = `${birthYear}${birthMonth}${birthDay}`;
    return birthDate;
}

/**
 * @desc 生成身份证
 * @param {Object} [data] - 可选参数对象
 * @param {string} [data.area] 地区编码 例如：510104 成都锦江区
 * @param {string} [data.birth] 出生日期, 格式为 'YYYYMMDD' 例如：19900101
 * @param {string} [data.gender] 性别 1:表示男性 0:表示女性
 * @returns {string} 生成的随机身份证号码
 */
function randomIdCard(data = { area: null, birth: null, gender: null }) {
    // 随机生成地区代码
    const areaCode = data.area ? data.area : randomArea().adcode;
    // 随机生成出生日期
    const birthDate = data.birth ? data.birth : randomBirth();
    // 顺序码，随机生成
    let sequenceCode = Math.floor(1 + Math.random() * 999).toString().padStart(3, '0');
    // 如果指定了性别，调整顺序码的最后一位
    sequenceCode = data.gender ? sequenceCode.slice(0, 2) + data.gender : sequenceCode;
    // 拼接前17位
    let idNumber = areaCode + birthDate + sequenceCode;
    // 计算校验码
    const factors = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
    let sum = 0;
    for (let i = 0; i < 17; i++) {
        sum += parseInt(idNumber.charAt(i), 10) * factors[i];
    }
    const checkCode = checkCodes[sum % 11];
    // 完整的身份证号码
    return idNumber + checkCode;
}

export { randomArea, randomBirth, randomIdCard };